package cn.liujianbo.example.springbean.bean4;

import cn.liujianbo.example.springbean.bean4.component.AppConfig;
import cn.liujianbo.example.springbean.bean4.component.UserService;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import javax.annotation.PostConstruct;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author 刘建波
 * @date 2021-10-10 21:21
 * 初始化前 @PostContract       初始化 InitializingBean
 * 推断构造     ----->      依赖注入    ----->      初始化前(执行 @PostContract 修饰的方法)
 * ----->      初始化 InitializingBean
 */
public class Test {
    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Object userService = context.getBean("userService");

        // spring如何执行@PostContract修饰的方法？
        for (Method method : UserService.class.getDeclaredMethods()) {
            if (method.isAnnotationPresent(PostConstruct.class)) {
                method.setAccessible(true);
                // 执行方法
                method.invoke(userService);
                method.setAccessible(false);
            }
        }

        // spring如何判断实现 InitializingBean 接口并执行实现的方法？
        if (userService instanceof InitializingBean) {
            try {
                // 判断实现 InitializingBean 接口并执行实现的方法
                ((InitializingBean) userService).afterPropertiesSet();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}
